/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.model.chart.CartesianChartModel;
import org.primefaces.model.chart.ChartSeries;
import org.primefaces.model.chart.LineChartSeries;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import pe.com.cotelasa.scp.controlador.backingBean.BKReporteIndicadores;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioCategoriaArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioCompraFacturacion;
import pe.com.cotelasa.scp.entidad.Articulo;
import pe.com.cotelasa.scp.entidad.CategoriaArticulo;
import pe.com.cotelasa.scp.entidad.CompraFacturacion;
import pe.com.cotelasa.scp.entidad.DetalleCompraFacturacion;
import pe.com.cotelasa.scp.to.ReporteIndicadoresTO;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author usuario
 */
@SuppressWarnings("serial")
@Named(value = "MBReporteIndicadores")
@Scope("request")
public class MBReporteIndicadores extends MBGenerico implements Serializable {

    private static Logger logger = Logger.getLogger(MBReporteAdministracion.class);
    @Inject
    private BKReporteIndicadores bk;
    @Inject
    private IServicioCompraFacturacion servicioFacturacion;
    @Inject
    private IServicioCategoriaArticulo servicioCategoriaArticulo;
    @Autowired
    BKSession session;

    public String mostrarMesVSMonto() {
        try {
            int i = UtilitarioFecha.obtenerAnio(servicioFacturacion.conseguirMasAntiguo(session.getEmpresa().getId()).getFecEmision());
            int j = UtilitarioFecha.obtenerAnio(servicioFacturacion.conseguirMasNuevo(session.getEmpresa().getId()).getFecEmision());
            bk.setAnios(new ArrayList<Integer>());

            bk.setListaCategorias(servicioCategoriaArticulo.listarCategoriasPadres());
            for (int n = i; n <= j; n++) {
                bk.getAnios().add(n);
            }
            bk.setCategoriaBusqueda(servicioCategoriaArticulo.conseguirCategoriaArticuloPorId(1));
            bk.setAnio1(UtilitarioFecha.obtenerAnio(new Date()));
            bk.setMesVSMonto(new CartesianChartModel());
            obtenerMeses();
            buscarMesVSMonto();
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al actualizar la información. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }

        return URLPaginacion.ReporteIndicadores.URL_MES_VS_MONTO;
    }

    public void buscarMesVSMonto() {
        try {
            bk.setListaDatos(new ArrayList<ReporteIndicadoresTO>());
            bk.setMesVSMonto(new CartesianChartModel());
            ChartSeries mesVSMonto = new ChartSeries();
            Date fecha;
            DetalleCompraFacturacion detalle = new DetalleCompraFacturacion();
            detalle.setIdArticulo(new Articulo());
            detalle.getIdArticulo().setIdCategoriaArticulo(bk.getCategoriaBusqueda());
            bk.setTotalGeneral(BigDecimal.ZERO);
            mesVSMonto.setLabel(bk.getCategoriaBusqueda().getNombre());
            for (Integer i : bk.getMeses()) {
                ReporteIndicadoresTO dato = new ReporteIndicadoresTO();
                fecha = UtilitarioFecha.construirFecha(bk.getAnio1(), i - 1, 1, 0, 0, 0);
                BigDecimal monto = servicioFacturacion.buscarMontoPorMes(detalle, fecha, session.getEmpresa().getId());
                dato.setMes(UtilitarioFecha.formatearFecha(fecha, "MMMM").toUpperCase());
                if (monto == null) {
                    monto = BigDecimal.ZERO;
                }
                dato.setMontoMes(monto);
                bk.setTotalGeneral(bk.getTotalGeneral().add(monto));
                mesVSMonto.set(UtilitarioFecha.formatearFecha(fecha, "MMMM").toUpperCase().substring(0, 3), monto.doubleValue());
                bk.getListaDatos().add(dato);
            }
            bk.getMesVSMonto().addSeries(mesVSMonto);

        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al actualizar la información. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void obtenerMeses() {
        bk.setMeses(new ArrayList<Integer>());
        for (int i = 1; i <= 12; i++) {
            bk.getMeses().add(i);
        }
    }
}
